<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    

    <script>
        // Promise 异步 =>  同步操作 
        // Promise 是异步编程的一种解决方案，比传统的解决方案——回调函数和事件——更合理和更强大  

        // 让代码更加简洁明了  后期更好的维护迭代

        // 所谓Promise，简单说就是一个容器，里面保存着某个未来才会结束的事件（通常是一个异步操作）的结果

        // 从语法上说，Promise 是一个对象，从它可以获取异步操作的消息 
        
        // Promise 的状态
        // pedding 进行中
        // fulfilled 已成功 resolve
        // rejected  已失败

        // Promise对象有以下两个特点
        // 1. 对象的状态不受外界影响   Promise对象代表一个异步操作，有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）
        // 2. 一旦状态改变，就不会再变，任何时候都可以得到这个结果
        // a.  pedding =>  fulfilled  =>  resolve 成功
        // b.  pedding =>  rejected   =>  reject  失败 
        
        // 只要这两种情况发生，状态就凝固了，不会再变了，会一直保持这个结果，这时就称为 resolved
        // Promise 构造函数
        // var p = new Promise()   // error  必须传递参数  成功失败结果 


        // 注：可以把Promise看成是状态机，当该Promise对象创建出来之后，其状态就是进行中pedding，
        // 然后通过程序来控制到底是执行已完成，还是执行已失败。因为Promise处理的是异步任务，
        // 所以我们还得对Promise做监听，当Promise的状态发生变化时，我们要执行相应的函数(then) 或者执行失败的函数(catch)
        

        


        // var p = new Promise(function(){
        //     // 函数 => 容器 => 存放执行某些异步事件的代码  => 异步操作 
        // })

        // console.log(p)
            

        // 封装性能很强  
        // 代码逻辑比较简单 

        console.log('start');
        var p = new Promise(function(resolve,reject){
            // resolve 成功回调
            // reject 失败回调 
            // 函数 => 容器 => 存放执行某些异步事件的代码  => 异步操作 

            // 回调函数 页面加载会立即执行 
            // debugger;
            console.log("PRomise 启动");

            setTimeout(()=>{
                console.log("延时器 启动了..")
                var num = Math.random()
                console.log(num)
                if(num > 0.5 ){
                    console.log("我不拖堂,下课直接唱歌")
                    resolve('true - 2107 - yyds');   // resolve(result);
                }else{
                    console.log("我要拖堂,周五直接唱歌")
                    reject('false - error ')    // reject(result)
                }
                console.log(p)
            },3000)
        })
        console.log(p)
        console.log("end")
    </script>
</body>
</html>